/*
 * Copyright 2010 Katsunori Koyanagi
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package sweezy.anim.easing
{
	import sweezy.anim.core.IEasing;

	public class Exponential
	{

		private static var _easeIn:IEasing;

		private static var _easeInOut:IEasing;

		private static var _easeOut:IEasing;

		private static var _easeOutIn:IEasing;

		public static function get easeIn():IEasing
		{
			if (_easeIn === null)
			{
				_easeIn = new EaseIn();
			}

			return _easeIn;
		}

		public static function get easeInOut():IEasing
		{
			if (_easeInOut === null)
			{
				_easeInOut = new EaseInOut();
			}

			return _easeInOut;
		}

		public static function get easeOut():IEasing
		{
			if (_easeOut === null)
			{
				_easeOut = new EaseOut();
			}

			return _easeOut;
		}

		public static function get easeOutIn():IEasing
		{
			if (_easeOutIn === null)
			{
				_easeOutIn = Easing.concat(easeOut, easeIn);
			}

			return _easeOutIn;
		}

		public function Exponential()
		{
		}
	}
}

/*---------------------------------------------------------------------------------
   Copyright (c) 2001 Robert Penner
   All rights reserved.

   Redistribution and use in source and binary forms, with or without modification,
   are permitted provided that the following conditions are met:

 * Redistributions of source code must retain the above copyright notice,
   this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.
 * Neither the name of the author nor the names of contributors may be used
   to endorse or promote products derived from this software without specific
   prior written permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
   ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 --------------------------------------------------------------------------------*/
import sweezy.anim.core.IEasing;
import sweezy.anim.easing.Exponential;

class EaseIn extends Exponential implements IEasing
{

	public function ease(fraction:Number):Number
	{
		if (fraction === 0)
		{
			return 0;
		}

		return Math.pow(2, 10 * (fraction - 1));
	}
}

class EaseInOut extends Exponential implements IEasing
{

	public function ease(fraction:Number):Number
	{
		if (fraction === 0 || fraction === 1)
		{
			return fraction;
		}

		fraction *= 2;

		if (fraction < 1)
		{
			return 0.5 * Math.pow(2, 10 * (fraction - 1));
		}

		return 0.5 * (-Math.pow(2, -10 * --fraction) + 2);
	}
}

class EaseOut extends Exponential implements IEasing
{

	public function ease(fraction:Number):Number
	{
		if (fraction === 1)
		{
			return 1;
		}

		return -Math.pow(2, -10 * fraction) + 1;
	}
}
